home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Reference Guide / C-C++ Interactive Reference Guide.iso / c_ref / csource3 / 126_01 / getc.c < prev    next >
Text File  |  1985-03-11  |  1KB  |  48 lines

  1. #include "bdscio.h"
  2.  
  3. int getc(iobuf)
  4. FILE *iobuf;
  5. {
  6.     int nsecs;
  7.  
  8.     /* CONSOLE */
  9.     if (iobuf == STD_IN) return getchar();
  10.  
  11.     /* READER */
  12.     if (iobuf == DEV_RDR) return bdos(3);
  13.  
  14.     /*  IF THERE ARE NO CHARACTERS LEFT IN THE BUFFER */
  15.     if (!(iobuf->_nleft)) {
  16.  
  17.         /* ATTEMPT TO READ ANOTHER BUFFER FULL (NSECTS SECTORS) */
  18.         if ((nsecs = read(iobuf->_fd, iobuf->_buff, NSECTS)) <= 0) {
  19.  
  20.             /* IF THERE IS NO MORE TO READ, RETURN EOF */
  21.             return(EOF);
  22.         }
  23.         /* IF ADDITIONAL SECTORS WERE READ,
  24.         RESET _nleft AND _nextp FOR NUMBER OF SECTORS READ */
  25.         else {
  26.             iobuf->_nleft = (nsecs * SECSIZ);
  27.             iobuf->_nextp = iobuf->_buff;
  28.         }
  29.     }
  30.     /* DECREMENT _nleft */
  31.     iobuf->_nleft--;
  32.  
  33.     /* RETURN NEXT CHARACTER, OR EOF IF IT IS ^Z=CPMEOF */
  34.     if (*iobuf->_nextp != CPMEOF) return(*iobuf->_nextp++);
  35.     else {
  36.         iobuf->_nextp++; /* NOT STRICTLY NECESSARY, BUT RETAINED
  37.                         FOR CONSISTENCY WITH LEOR'S GETC (WHICH
  38.                         HOWEVER RETURNS CTRL_Z UNALTERED);
  39.                         SEEKEND() USES UNGETC AFTER EOF SO
  40.                         FAILS IF THIS IS OMITTED */
  41.         return(EOF);
  42.     }
  43. }
  44. {
  45.     int nsecs;
  46.  
  47.     /* CONSOLE */
  48.     if (iobuf == STD_IN) return getchar();